package {
	import SEApp.dialogs.se_friendsDialog;
	
	import UIFree.ObjectEvent;
	import UIFree.uif_styles;
	
	import ad.clt_ad;
	
	import api.clt_myserver;
	import api.clt_servers;
	import api.clt_vkserverAPI;
	
	import api_servers.api_server;
	
	import classes.clt_events;
	import classes.vk_styles;
	
	import com.adobe.images.PNGEncoder;
	
	import components.banners.clt_topBannersVK;
	import components.banners.clt_waitBanner;
	import components.clt_albums;
	import components.clt_layer;
	import components.dialogs.clt_vkWaitDialog;
	import components.game.clt_gameLayer;
	
	import data.cd_clothing;
	import data.clt_data;
	
	import flash.display.BitmapData;
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.events.IOErrorEvent;
	import flash.geom.Point;
	import flash.net.FileReference;
	import flash.utils.ByteArray;
	
	import vk.events.*;
  	
	[SWF(width="760", height="1206", backgroundColor="#FFFFFF")]
	public class vk_clothing extends clt_clothingBase {
		private static const access: uint = 1 | 2 | 4 | 8192;
		public static const toDiskSize: Point = new Point(600, 600);
		public static const toAlbumSize: Point = new Point(600, 600);
		public static const toQuestionSize: Point = new Point(280, 280);
		public static const GFEXT: String = '.jpg';
		public static const PNGEXT: String = '.png';
		 
		private var _friendsDialog	: se_friendsDialog;
		private var _selectAlbum	: clt_albums;
		private var _appUsers		: Object;
		
		public function vk_clothing() {
			super(760, 1206);
			
			for (var i:int=0; i<cd_clothing.groups.length; i++) {
				if (cd_clothing.groups[i].id == 201) cd_clothing.groups[i].url = 'http://cs10725.vk.com/u44108006/fcc2b63625c696.zip';
			}
			
			this.dispatchEvent(new Event(GDataEvent.REQUEST));
		}
		
		public function get appUsers(): Array {
			return (_appUsers && _appUsers.hasOwnProperty('length'))?(_appUsers as Array):[];
		}
		
		protected function doSuperCreateComponents(): void {
			super.createComponents();
			new clt_gameLayer(layers[0], clt_layer.ALIGNTOP);
		}
		
		protected function doVoteDouble(e: ObjectEvent): void {
			alert(This.classes.locale.WARNING, This.classes.locale.DEVMSG);
		}
		
		protected function doVoteMega(e: Event): void {
			alert(This.classes.locale.WARNING, This.classes.locale.DEVMSG);
		}

		override protected function doToGameComplete(): void {
			showInviteDialog();
			imageToGameSend();
		}
		
		override public function get appstage(): EventDispatcher {
			return this;
		}
		
		override protected function initSiteData(): Object {
			var PAYSERVICE1TEXT: String = ' с момента активации. Стоимость сервиса: <font color="#FF0000">3 голоса.</font>';
			return {
				WALLMESSAGE			: 'Коллаж от %s',
				WAITDESCRIPTION		: '<b>Подождите: %s.</b>\n<font size="16">Приглашайте друзей и время ожидания значительно сократиться!</font>\nЗа каждого друга время ожидания сокращается на 2 сек.',
				WAITDESCRIPTION2	: 'Для продолжения, нажмите кнопку "Ок".\nИли пригласите друзей в приложение.',
				INVITEDESCR			: 'У вас есть чувство юмора и вы готовы получать дружеские шаржи от друзей?\nВы хотите поделиться своей находкой с друзьями?',
				NOUSERALBUMACCESS	: 'Нет доступа к альбомам пользователя, или приложение не установлено.\nПригласите друга для получения доступа к альбомам.',
				NOALBUMS			: 'Нет доступных альбомов',
				VOTEDOUBLEHELP		: 'Удваивает поступившие голоса для этого коллажа в течении суток' + PAYSERVICE1TEXT,
				VOTEMEGAHELP1		: 'Поставьте максимальную, МЕГА оценку!',
				VOTEMEGAHELP2		: 'Вы получите возможность ставить максимальную оценку в течении суток' + PAYSERVICE1TEXT,
				EMPTYGAME			: 'Коллаж удален автором или конкурс окончен',
				INPUTNAMEGAME		: 'Введите название вашего коллажа'
			};
		}
		
		override public function get saveMenuList(): Array {
			return [
				{caption: ' В компьютер ', method		: doToDisk},
				{caption: ' Только фигуру (PNG)', method		: doToFilePNG},
				{caption: ' В фотоальбом ', method		: doToAlbum},
				{caption: ' На стену друга ', method	: doToWall},
				{caption: ' Отправить на конкурс ', method		: doToGame}
			]
		}
		
		override protected function initTopBanner(): void {
			new clt_topBannersVK(this, '468282879');
		}
		
		protected function doIOError(e: IOErrorEvent): void {
			trace(e);
		}
		
		override protected function createComponents():void {
			function doResponseSettings(setting: uint): void {
				if ((setting & access) != access) {
					externalServer.showSettingsBox(access, function(e: Event): void {
						doSuperCreateComponents();
					});
				} else doSuperCreateComponents();
			}
			
			doResponseSettings(uint(externalServer.flashVars['api_settings']));
		}
		
		override protected function workspaceEvents():void {
			super.workspaceEvents();
			
			workspace.addEventListener(clt_events.VOTEMEGA, doVoteMega); 
			workspace.addEventListener(clt_events.VOTE2, doVoteDouble); 
			workspace.addEventListener(clt_events.INVITEDIALOGSHOW, function(e: Event): void {
				showInviteDialog();
			});
		}
		
		override protected function initialize():void {
			super.initialize();
			if (externalServer.flashVars['api_result']) _appUsers = externalServer.flashVars['api_result'];
			dispatchEvent(new Event(GDataEvent.RESPONSE));
		}
		
		override public function showInviteDialog(): void {
			externalServer.showInviteBox();
		}
				
		protected function inviteDialogShow(): void {
			alert(This.classes.locale.WARNING, sitedata.INVITEDESCR, function(): void {
				showInviteDialog();
			}, true);
		}
		
		override protected function queryUserData(postFunc: Function): void {
			externalServer.getProfiles(externalServer.viewer_id, function(data: Array): void { 
				postFunc(data[0]);
				inviteDialogShow();
				new clt_ad(_rLayer);
				//new clt_adInvestSystem(_rLayer);
			}, 'uid,first_name,last_name,nickname,sex,bdate,photo,photo_medium,photo_big', 'userProfile');
		}
		
		override protected function createInternalServer():api_server {
			clt_myserver.MODEL_NAME = 'cltvk07';
			var secrets: Object = {
				'2122544': 'cHPxpBgavHDa4Y5bbxua',
				'2350118': 'oUpt0Did29fognmtSSnW'
			};
    		return new clt_myserver(this, clt_servers.MAIN_URL + '/games/index.php', externalServer.app_id, secrets[externalServer.app_id]);
		}
		
		override protected function createExternalServer():api_server {
			stage.addEventListener(IOErrorEvent.IO_ERROR, doIOError);
   			return new clt_vkserverAPI(this);
			return null;
		}
		
		public function friendSelect(selectFunc: Function): se_friendsDialog {
			if (!_friendsDialog) {
				_friendsDialog = new se_friendsDialog(dialogLayer, 1, 'items');
			}
			_friendsDialog.showSelect(selectFunc);
			return _friendsDialog;
		}
		
		protected function getByteArray(size: Point, coder: Function, options: Object=null): ByteArray {
			var result: BitmapData = getResult(size.x, size.y, options);
			var ba: ByteArray = encodeFromJPG(result);
			result.dispose();
			return ba;
		}
		
		override public function saveToFile(FileData: ByteArray, fileName: String=''): void {
			function execute(e: Event=null): void {
				var fr: FileReference;
				fr = new FileReference();
				fr.save(FileData, fileName?fileName:genFileNameCard(GFEXT));
			}
			(new clt_vkWaitDialog(dialogLayer, This.sitedata.WAITDESCRIPTION, This.sitedata.WAITDESCRIPTION2, waitCountSec, clt_waitBanner, execute)).show();
		}
		
		protected function doToDisk(): void {
			saveToFile(getByteArray(toDiskSize, encodeFromJPG), genFileNameCard(GFEXT));
		}
		
		protected function doToFilePNG(): void {
			saveToFile(getByteArray(toDiskSize, PNGEncoder.encode, {noback: true}), genFileNameCard(PNGEXT));
		}
		
		protected function selectAlbum(postFunc: Function): clt_albums {
			if (!_selectAlbum) _selectAlbum = new clt_albums(dialogLayer);
			_selectAlbum.showSelect(postFunc);
			return _selectAlbum;
		}
		
		protected function get waitCountSec(): int {
			var count: int = clt_data.WAITSECCOUNT - (appUsers.length * 2) - 100;
			return (count>0)?count:0;
		}

		protected function doToAlbum(): void {
			var sa: clt_albums = selectAlbum(function(album: Object): void {
				sa.close();
				function execute(e: Event=null): void {
					externalServer.uploadToAlbum(album.aid, genFileNameCard(GFEXT), getByteArray(toAlbumSize, encodeFromJPG), function(): void {
						alert(This.classes.locale.MESSAGE, This.classes.locale.PUBRESULT);
					});
				}
				(new clt_vkWaitDialog(dialogLayer, This.sitedata.WAITDESCRIPTION, This.sitedata.WAITDESCRIPTION2, waitCountSec, clt_waitBanner, execute)).show();
			});
		}

		protected function doToWall(): void {
			var dlg: se_friendsDialog = friendSelect(function(friend: Object): void {
				dlg.close();
				externalServer.uploadToWall(friend.uid, genFileNameCard(GFEXT), Utils.sprintf(sitedata.WALLMESSAGE, userName(user)) , getByteArray(toAlbumSize, encodeFromJPG), function(): void {
					alert(This.classes.locale.MESSAGE, This.classes.locale.PUBRESULT);
				});
			});
		}
		
		public static function userName(userData: *): String {
			if (userData) {
				var name: String = userData.first_name + ' ' + userData.last_name;
				if (!name) name = userData.nickname;
				return name;
			}
			return '';
		}
		
		override protected function getStyles(): uif_styles {
			return new vk_styles();
		}

	}
}